package com.darwin.darwinUI.assist
{
	import flash.utils.Dictionary;

	/**
	 * Group是一个特殊的组件，它可以被用来管理一组继承IGroupItem的对象，使这一组对象(按钮，勾选
	 * 框，选项卡....)中有最多只有1个对象处于选中状态，并同时告知通知目标对象(GroupTarget)，
	 * GroupTarget可以是一个会响应GroupItem状态改变的面板，或者其它非显示对象的管理器，如Controller等。
	 * @author Roland
	 */
	public class Group
	{
		private var _itemDic:Dictionary;
		private var _targetDic:Dictionary;
		public function Group()
		{
			_itemDic = new Dictionary();
			_targetDic = new Dictionary();
		}
		
		/**
		 *	注册一个对象
		 * @param item
		 * 
		 */
		public function registerItem(item:IGroupItem):void
		{
			_itemDic[item] = item;
			item.group = this;
		}
		
		/**
		 *	注销一个已注册的对象 
		 * @param item
		 * 
		 */
		public function unregisterItem(item:IGroupItem):void
		{
			delete _itemDic[item];
			item.group = null;
		}
		
		/**
		 *	注册一个通知目标对象 
		 * @param target
		 * 
		 */
		public function registerTarget(target:IGroupTarget):void
		{
			_targetDic[target] = target;
		}
		
		/**
		 *	 注销一个已注册的通知目标对象
		 * @param item
		 * 
		 */
		public function unregisterTarget(target:IGroupTarget):void
		{
			delete _targetDic[target];
		}
		
		/**
		 *	通知Group传入的item已经开始切换选中状态的动作(如某一段动画) 
		 * @param item 进行切换动作的对象
		 * @param selected 切换动作完成后item将处于的选择状态
		 */
		public function itemSelectActionStart(item:IGroupItem,selected:Boolean):void
		{
			if(selected==false) return;
			item.selectAction(selected);
			for each (var $otherItem:IGroupItem in _itemDic) 
			{
				if($otherItem != item)
				{
					$otherItem.selectAction(!selected);
				}
			}
		}
		
		/**
		 *	通知Group传入的item已经完成切换选中状态的动作(如某一段动画) 
		 * @param item 已经完成了切换动作的对象
		 * @param selected 切换动作完成后item需要设置成的选择状态
		 */
		public function itemSelectActionEnd(item:IGroupItem,selected:Boolean):void
		{
			item.immediateSelected = selected;
			if(selected==true)
			{
				for each (var $target:IGroupTarget in _targetDic) 
				{
					$target.itemSelectionChange(item,selected);
				}
			}
			for each (var $item:IGroupItem in _itemDic) 
			{
				$item.groupSelectionChange(item);
			}
		}
	}
}